package com.jeasonzhao.commons.db;

public class SqlHelper
{
//    private String originalSql = null;
//
//    public SqlHelper(String sql)
//    {
//        this.originalSql = sql;
//    }
//
//    protected SqlParameterStatus checkParameter(String parametersName)
//    {
//        return null;
//    }
//
////    private ReportParamCollection cordinateParameters(Report report
////        ,LexTokenCollection initSqlToken
////        ,ReportParamCollection reportParameters)
////        throws ReportException
////    {
////        if(null == reportParameters)
////        {
////            reportParameters = new ReportParamCollection();
////        }
////        LexTokenCollection sqlParameters = getParamterFromSQL(initSqlToken);
////        if(null == sqlParameters || sqlParameters.size() < 1)
////        {
////            return null; //No SQL parameters, set the return value to NULL
////        }
////        //Check the un-mapped SQL parameters
////        String strUnmappedParameters = getUnmappedParameterNames(sqlParameters,reportParameters);
////        if(Algorithms.notEmpty(strUnmappedParameters))
////        {
////            throw new ReportException.UnmappedParameter(report,strUnmappedParameters);
////        }
////        //reportParameters should not be NULL after getUnmappedParameterNames()
////        reportParameters.removeDupliactedItems();
////        //Remove the report-parameters which not in SQL parameters
////        for(int n = 0;n < reportParameters.size();n++)
////        {
////            if(sqlParameters.find(reportParameters.get(n).getParam(),false) < 0)
////            {
////                reportParameters.remove(n);
////                n--;
////            }
////        }
////        return null == reportParameters || reportParameters.size() < 1 ? null : reportParameters;
////    }
////
////    public SqlPreparation prepareSqlDotNetStyle(Report report,String strSql,ReportParamCollection ps,
////                                                char prefix)
////        throws SQLReportException
////    {
////        return prepareSql(report,strSql,ps,true,prefix);
////    }
////
////    public SqlPreparation prepareSqlJavaStyle(Report report,String strSql,ReportParamCollection ps)
////        throws SQLReportException
////    {
////        return prepareSql(report,strSql,ps,false,SqlTokenizer.END);
////    }
//
//    public String prepareSql(String strSql,boolean namedParameters,char namePrefix)
//    {
//        if(Algorithms.isEmpty(strSql))
//        {
//            return null;
//        }
//        LexTokenCollection originalTokens = (new SqlTokenizer(strSql)).getTokens(false,false);
//        StringCollection newTokens = new StringCollection();
//        java.util.ArrayList<SqlParameter> destParameters = new java.util.ArrayList<SqlParameter>();
//        for(int nToken = 0;nToken < originalTokens.size();nToken++)
//        {
//            LexToken token = originalTokens.elementAt(nToken);
//            if(SqlTokenizer.isSQLParameterToken(token))
//            {
//                SqlParameterStatus st=Algorithms.nvl(checkParameter(token.getToken()),SqlParameterStatus.Default);
//                boolean hasValue=st.hasValue();
//                java.util.List<Object> values=st.getValues();
//                if(st.getUsage()== ParameterUsage.Replacement)
//                {
//                    newTokens.add(token.replaceToken(hasValue==false ? "" :Algorithms.join(values,",")));
//                }
//                else if(hasValue==false && st.getUsage()== ParameterUsage.Optional)
//                {
//                    if(nToken <= 0)
//                    {
//                        throw new ReportException.OptParamAtBegin(report,param,token);
//                    }
//                    nToken = removeOptionalParameterFromSQL(report,originalTokens,newTokens,nToken,token);
//                }
//                else if(st.isSingleSelect()==false && hasValue && values.size()>1)
//                {
//                    //Multi selected parameters
//                    if(nToken <= 0)
//                    {
//                        throw new ReportException.MultiParamAtBegin(report,param,token);
//                    }
//                    nToken = expandMultiValueParameterSql(report,originalTokens,newTokens
//                        ,destParameters,nToken,token,param,isKeepParamNameInSql,prefix);
//                }
//                else
//                {
//                    String strNewName = getParameterName(param.getParam(),isKeepParamNameInSql,prefix);
//                    newTokens.add(strNewName);
//                    destParameters.add(generateSqlParameter(param,param.getSingleParamValue(),strNewName));
//                }
//            }
//            else
//            {
//                newTokens.add(token.getInitString());
//            }
//        }
//        SqlPreparation ret = new SqlPreparation(newTokens.toString(" ",false));
//        ret.setParameters(destParameters);
//        return ret;
//
//    }
//
//    private int m_nParameterIndex = 0;
//    private String getParameterName(String strName,boolean isKeepingName,char prefix)
//    {
//        if(Algorithms.isEmpty(strName))
//        {
//            strName = "?";
//        }
//        if(isKeepingName)
//        {
//            strName = strName.trim();
//            if(SqlTokenizer.END == prefix)
//            {
//                prefix = '@'; //Default TSQL
//            }
//            if(strName.equals("?"))
//            {
//                m_nParameterIndex++;
//                return prefix + "auto_generate_param_name_" + m_nParameterIndex;
//            }
//            else
//            {
//                if(SqlTokenizer.isSQLParameterToken(strName))
//                {
//                    strName = strName.substring(1);
//                }
//                return prefix + strName;
//            }
//        }
//        else
//        {
//            return "?"; //Java style
//        }
//    }
//
//    private SqlParameter generateSqlParameter(ReportParam param,Object value,String strNewParameterName)
//    {
//        SqlParameter p = new SqlParameter(param.getParam());
//        p.setName(strNewParameterName);
//        int nType = SqlParameter.getTypeFromClass(param.getDataType().getInitType());
//        if(null == value)
//        {
//            p.setDbNull(nType);
//        }
//        else
//        {
//            p.setValue(value,nType);
//        }
//        return p;
//    }
//
//    private int removeOptionalParameterFromSQL(Report report,LexTokenCollection initSqlTokens
//                                               ,StringCollection newTokens
//                                               ,int nToken,LexToken token)
//        throws ReportException
//    {
//        //get the condition operations
//        int nBracketCount = 0;
//        for(int n = nToken - 1;n >= 0;n--)
//        {
//            LexToken tkPrev = initSqlTokens.elementAt(n);
//            nBracketCount += tkPrev.equals("(") && tkPrev.getType() == LexTokenTypes.SPECIAL ? 1 : 0;
//            boolean bBreak = tkPrev.isName()
//                && tkPrev.getToken().equalsIgnoreCase("in") == false
//                && tkPrev.getToken().equalsIgnoreCase("like") == false
//                && tkPrev.getToken().equalsIgnoreCase("not") == false;
//            if(bBreak)
//            {
//                newTokens.removeTail();
//                break;
//            }
//            newTokens.removeTail();
//        }
//        //Remove the end brackets
//        while(nBracketCount > 0 && nToken < initSqlTokens.size() - 1)
//        {
//            nToken++;
//            LexToken tkPrev = initSqlTokens.elementAt(nToken);
//            if(tkPrev.equals(")") && tkPrev.getType() == LexTokenTypes.SPECIAL)
//            {
//                nBracketCount--;
//            }
//        }
//        //Find the name and bracket
//        for(;nToken < initSqlTokens.size();nToken++)
//        {
//            LexToken tkPrev = initSqlTokens.elementAt(nToken);
//            if(((tkPrev.equals(")") || tkPrev.equals("(")) && tkPrev.getType() == LexTokenTypes.SPECIAL) || tkPrev.isName())
//            {
//                break;
//            }
//        }
//        if(nBracketCount > 0)
//        {
//            throw new ReportException.UnmatchedBracket(report,token);
//        }
//        newTokens.add("1=1");
//        return nToken;
//    }
//
//    private int expandMultiValueParameterSql(Report report,LexTokenCollection initSqlTokens,
//                                             StringCollection newTokens,java.util.ArrayList<SqlParameter> destParameters,
//        int nToken,LexToken token,ReportParam param,boolean keepName,char prefix)
//        throws ReportException
//    {
//        LexToken tkPrev = initSqlTokens.elementAt(nToken - 1);
//        if(tkPrev.equals("(") && tkPrev.getType() == LexTokenTypes.SPECIAL)
//        {
//            newTokens.removeTail();
//            tkPrev = initSqlTokens.elementAt(nToken - 2);
//            //?????????????????????
//            if(nToken + 1 < initSqlTokens.size() && initSqlTokens.elementAt(nToken + 1).equals(")"))
//            {
//                nToken++;
//            }
//        }
//        newTokens.remove(newTokens.size() - 1);
////        if(tkPrev.getType() != LexTokenTypes.NAME && tkPrev.getType() != LexTokenTypes.SPECIAL)
////        {
////            throw new ReportException.MultiParamOperatorError(report,token,tkPrev);
////        }
//        String strPrev = null;
//        String strPost = null;
//        if(tkPrev.getToken().equalsIgnoreCase("=")
//           || tkPrev.getToken().equalsIgnoreCase("==")
//           || tkPrev.getToken().equalsIgnoreCase("in"))
//        {
//            strPrev = "in(";
//            strPost = ")";
//        }
//        else if(tkPrev.getToken().equalsIgnoreCase("<>")
//                || tkPrev.getToken().equalsIgnoreCase("!="))
//        {
//            strPrev = "not in(";
//            strPost = ")";
//        }
//        else
//        {
//            throw new ReportException.MultiParamOperatorError(report,token,tkPrev);
//        }
//        newTokens.add(strPrev);
//        for(int nx = 0;nx < param.valueSize();nx++)
//        {
//            if(nx > 0)
//            {
//                newTokens.add(",");
//            }
//            String strNewName = getParameterName(null,keepName,prefix);
//            newTokens.add(strNewName);
//            destParameters.add(generateSqlParameter(param,param.getValue(nx),strNewName));
//        }
//        newTokens.add(strPost);
//        return nToken;
//    }
//
//    private ReportParam checkParameter(Report report,ReportParamCollection ps,String strSqlParameterName)
//        throws SQLReportException
//    {
//        ReportParam param = ps.findParameterByName(strSqlParameterName);
//        if(null == param)
//        {
//            throw new ReportException.UnmappedParameter(report,strSqlParameterName);
//        }
//        if((false == param.isOptional() || param.isFixedValue()) && false == param.hasBeenSetValues())
//        {
//            throw new ReportParameterException.ParameterNotSet(report,param);
//        }
//        return param;
//    }
//
//    public static void main(String[] argvs)
//        throws Exception
//    {
//        ReportParamCollection collections = new ReportParamCollection();
//        ReportParam p = new ReportParam();
//        p.setParam("@Date");
//        p.setIsSingleSelect(false);
//        p.setIsOptional(true);
//        p.setDataType(DataTypes.DATE);
//        p.setValue(new java.util.Date(),new java.util.Date(),new java.util.Date());
//        collections.add(p);
//        p = new ReportParam();
//        p.setParam("@endDate");
//        p.setIsOptional(true);
//        p.setDataType(DataTypes.DATE);
//        p.setValue(new java.util.Date(),new java.util.Date(),new java.util.Date());
//        collections.add(p);
//        ////////////////////////////////////////////////////////////////////////
//        String strSql =
////            "\n"+" select a.kpiid kpiid,cityid,kpidate,kpivalue,kpivalue2,kpivalue3,kpivalue4" +
////            "\n"+" from kpi_values a,kpi_define b" +
////            "\n"+" where b.kpiid=a.kpiid" +
////            "\n"+" and a.kpiid<2" +
////            "\n"+" and a.cityid >=1 and a.cityId<=10" +
//            "\n" + " Aand a.kpidate1 not in(@Date) " +
//            "\n" + " Band a.kpidate2 !=(@Date) and project_name like ('%'||'%')" +
//            "\n" + " Cand a.kpidate3 <>@Date " +
//            "\n" + " Dand a.kpidate4 <=@endDate";
//        SqlPreparation ps = PrepareSQL.prepareSqlDotNetStyle(null,strSql,collections,':');
//        System.out.println(ps.getSql());
//    }

}
